home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / StyledText.h < prev    next >
C/C++ Source or Header  |  1990-12-07  |  6KB  |  198 lines

  1. #ifndef StyledText_First
  2. #ifdef __GNUG__
  3. #pragma once
  4. #endif
  5. #define StyledText_First
  6.  
  7. #include "GapText.h"
  8. #include "RunArray.h"
  9.  
  10. overload new_Style;
  11.  
  12. //------ Style ----------------------------------------------------------------
  13.  
  14. class Style: public Object {
  15. friend class StyleTable;
  16.     FontPtr fp;
  17.     GrPattern ink;
  18.     
  19.     Style(int, FontPtr f, GrPattern ink= ePatBlack);
  20.  
  21. public:
  22.  
  23.     MetaDef(Style);
  24.  
  25.     friend Style *new_Style(int, FontPtr f, GrPattern= ePatBlack);
  26.     friend Style *new_Style(FontPtr f= gSysFont, GrPattern= ePatBlack);
  27.     friend Style *new_Style(GrFont ft, GrFace fc, int Size, GrPattern= ePatBlack);
  28.     
  29.     ~Style();
  30.     bool IsEqual (Object*);
  31.     void GetStyle (GrFont *fid, GrFace *face, int *size, GrPattern *ink);
  32.     FontPtr GetStyle()
  33.     { return fp; } 
  34.     GrPattern GetInk()
  35.     { return ink; }
  36.     ostream &PrintOn(ostream &s); 
  37.     ostream &DisplayOn(ostream &s); 
  38.     istream &ReadFrom(istream &s); 
  39.     ObjPtr DeepClone();
  40. };
  41.  
  42. //------ StyledText -----------------------------------------------------------
  43.  
  44. enum StChangeStyle {    // modes for SetStyle
  45.     eStFont     = BIT(0),       
  46.     eStFace     = BIT(1),       
  47.     eStSize     = BIT(2), 
  48.     eStAddSize  = BIT(3),    
  49.     eStInk      = BIT(4),    
  50.     eStAll      = eStFont + eStFace + eStSize + eStInk // change all
  51. };
  52.  
  53. struct StyleSpec {
  54.     GrFont font;
  55.     GrFace face;
  56.     short size;
  57.     GrPattern ink;
  58.     bool xor; // apply face change in an XOR or OR fashion
  59.  
  60.     StyleSpec();
  61.     StyleSpec(Font *fp= gSysFont, GrPattern c= ePatBlack, bool mode= TRUE);
  62.     StyleSpec(GrFont ft, GrFace fc, int sz, GrPattern c= ePatBlack, bool mode= TRUE);
  63. };
  64.  
  65. //---- class TextRunArray --------------------------------------------------
  66.  
  67. class TextRunArray: public RunArray {
  68.     class StyledText *st;
  69. public:
  70.     MetaDef(TextRunArray);
  71.  
  72.     TextRunArray(StyledText *sp = 0, int elements = cCollectionInitCap);
  73.  
  74.     ObjPtr RunAt(int i, int *start, int *end, int *size ,int *lenat);
  75.     ostream &PrintOn(ostream &s); 
  76.     istream &ReadFrom(istream &s); 
  77.     Object *ReadItem(istream &s); 
  78. };
  79.  
  80. //---- class StyledText -------------------------------------------------
  81.  
  82. class StyledText: public GapText {                                                           
  83. friend class StyledTextIter;
  84.     class TextRunArray *styles;
  85.     Style *sp;      // current style and position of next font change
  86.  
  87.     Style *styleHere; // style used during next text insertion
  88.     bool applyStyleHere; // will we use styleHere ?
  89.  
  90.     byte escape; // escape character           
  91.     int nextFontChange, start, end, size, lenat;
  92.  
  93.     byte CharAt(int i)
  94.     { return GapText::CharAt(i); }
  95.  
  96.     bool NextFontChange (int at)
  97.     { if (at == nextFontChange) {
  98.         sp= (Style*)styles->RunAt(at,&start,&end,&size,&lenat);
  99.         nextFontChange= at + lenat;
  100.         return TRUE;
  101.       }
  102.       else 
  103.         return FALSE;
  104.     }
  105.     void Init(FontPtr fd, bool styleHere);
  106.     Style *ApplySpec(Style *ostyle, StyleSpec st, StChangeStyle mode);
  107.     void BuildStylesFromString(Style *initiaStyle, char *buf);
  108. protected:
  109.     void SetFStringVL(char *fmt, va_list va);
  110. public:
  111.     MetaDef(StyledText);
  112.  
  113.     StyledText();
  114.     StyledText(int size, FontPtr fd= gSysFont);
  115.     StyledText(byte *buf, int len = -1, bool ic = FALSE, FontPtr fd= gSysFont);
  116.     StyledText(class TextRunArray *st, byte *buf, int len = -1, bool ic = FALSE);
  117.     StyledText(FontPtr fd, char* format, ...);
  118.     // to create a text in different faces, specified in a string
  119.     // 'format' can contain a format specifications as strprintf.
  120.     // Extensions are: @B, @I, @O, @S, @P, @U with the meaning to change the 
  121.     //                 face of the text to
  122.     //                 Bold,Italic,Outline,Shadow,Plain,Underline
  123.     // example:
  124.     // char * filename;
  125.     // StyledText ex("File @B%s@B does not exist", filename);
  126.     ~StyledText();
  127.     void InitNew();
  128.  
  129.     TextRunArray *GetStyles();
  130.     TextRunArray *SetStyles(TextRunArray *st);
  131.     
  132.     //---- editing
  133.     void ReplaceWithStr(byte *str,int len = -1); 
  134.     void Cut(int from,int to);
  135.     void Paste(TextPtr t,int from,int to);
  136.     void Insert(byte c, int from,int to);
  137.     Text *GetScratchText(int size); 
  138.     void Copy(Text* save,int from, int to);
  139.     TextPtr Save(int from, int to);
  140.     
  141.     //---- rendering/mapping
  142.     int TextWidth(int from, int to);
  143.     void DrawText(int from, int to, Rectangle clip);
  144.     void DrawTextJust(int from, int to, int w, Point start, Rectangle clip);
  145.     int PointToPos(int from, int to, int w, Point start, Point pos);
  146.     int CharToPos(int from, int to, int at, int w);
  147.     void JustifiedMap(int from, int to, int w, int stopAt, int posX, int *charPos, int *x);
  148.     
  149.     //---- style manipulation
  150.     void SetStyle(StChangeStyle mode, int from, int to, StyleSpec newStyle);
  151.     Style *GetStyle(int at);
  152.     FontPtr GetFont(int at = 0);
  153.     void SetFont(FontPtr);
  154.     // apply the font to entire text
  155.     void ReplaceStyles(RunArray *styles, int from, int to);
  156.     void CopyStyles(RunArray *styles,int from, int to);
  157.     void ResetCurrentStyle();
  158.     const Style *GetCurrentStyle();
  159.     // 0 == no current style
  160.  
  161.     //---- escape character handling
  162.     void SetEscapeChar (byte);
  163.     byte GetEscapeChar ();
  164.     virtual int CalcEscape (int at,LineDesc* = 0);
  165.     virtual void DrawEscape (int at,Rectangle clip);
  166.     virtual bool IsEscape (int at);
  167.     bool DoEscape(int at, int ch)
  168.     { return (bool) (escape && ch == escape && IsEscape(at)); }
  169.  
  170.     TextIter *MakeIterator(int from=0, int to = cMaxInt);
  171.  
  172.     //---- activation/passivation
  173.     ostream &PrintOn(ostream &s); 
  174.     istream &ReadFrom(istream &s); 
  175.     istream &ReadFromAsPureText(istream &s, long sizeHint= -1);
  176. };
  177.  
  178. //---- class StyledTextIter -------------------------------------------------
  179.  
  180. class StyledTextIter: public GapTextIter {
  181.     int nextFontChange, start, end, size, lenat;
  182.     Style *sp;
  183. public:
  184.     StyledTextIter(Text *s,int from = 0,int to = cMaxInt);
  185.     void Reset(Text *s,int from = 0, int to = cMaxInt);        
  186.     int operator()();
  187.     int operator()(int *width, LineDesc*);// returns width of the character too
  188.     int Token(int *width, LineDesc*); // returns next token with its extent
  189.     int Line(LineDesc* l = 0);        // return end of next line
  190.     byte CharAt(int i)
  191.     { return ((StyledText*)ct)->CharAt(i); }
  192.     bool NextFontChange ();
  193.     bool DoEscape(int at, int ch)
  194.     { return ((StyledText*)ct)->DoEscape(at,ch); }
  195. };
  196.  
  197. #endif StyledText_First
  198.